
\section{{\em Label me}}
{\em Label me} es un claro ejemplo de los etiquetadores actuales. Con esta aplicaci\'on, el usuario puede etiquetar cualquier objeto que aparezca en una imagen utilizando una secuencia de puntos.  El usuario puede subir al servidor una imagen y permitir a otras personas etiquetar objetos de la misma, con el fin de hacer la tarea mucho m\'as f\'acil. Adem\'as, permite la descarga de las etiquetas en formato  xml, para posteriormente poder trabajar con los datos obtenidos.

Esta aplicaci\'on, tiene como ventaja su interfaz liviana, ya que es muy clara y simple. Esto facilita al usuario el manejo y entendimiento de la aplicaci\'on. Como inconvenientes encontramos que, al solo disponer de figuras formadas por puntos, a veces las etiquetas no son tan precisas como el usuario requiere. Adem\'as, no podemos darle significado extra a cada una de las etiquetas.

\begin{figure}[here]
    \centering
    \includegraphics[scale=0.4]{figuras/labelme.jpg}
 \caption{Label me}
\end{figure}

\pagebreak
Como se observa en la fotograf\'ia, el sistema de etiquetaje tiene un claro defecto, y es que, cada etiqueta tiene los bordes demasiado gruesos y la imagen resultante no es demasiado atractiva visualmente. A su vez,  para seleccionar una etiqueta ya definida, solamente podemos hacerlo presionando sobre uno de sus bordes y no estando en el interior de la misma.	

Una de las funcionalidades que menos nos convence es el hecho de que, si un usuario sube una imagen para uso personal o para etiquetar una serie de \'items espec\'ificos, cualquier otro usuario puede a\~{n}adir etiquetas que no tengan el mismo fin. Por otro lado, en el caso de querer etiquetar miles de im\'agenes, el proceso para poder hacerlo no es el adecuado. 
Puesto para cada una de las im\'agenes que el usuario desea etiquetar, debe presionar el bot\'on upload  para seleccionarla y subirla al servidor. Exactamente lo mismo que para descargar los resultados. Tambi\'en encontramos que para cada una de las im\'agenes disponemos de un fichero XML que contiene las etiquetas de la misma, por lo que para 1000 im\'agenes, dispondr\'iamos de 1000 ficheros XML.


\section{Objetivos}
Como se ha mencionado anteriormente, el objetivo del proyecto es crear un etiquetador totalmente personalizable para que pueda ser aplicado en \'ambitos diversos. Para ello lo primero que se ha tenido que plantear es con que lenguaje programarlo. Primeramente, se barajaron las ventajas e inconvenientes que dispon\'ian los diversos lenguajes de programaci\'on. 

Se encontr\'o que Java nos permitir\'ia hacer una aplicaci\'on multiplataforma muy f\'acilmente a dem\'as de poder distribuirla por Internet con tan solo unos pocos cambios. Sin embargo, el lenguaje de programaci\'on {\em Processing} nos aporta m\'as ventajas todav\'ia.

{\em Processing} es una implementaci\'on del lenguaje de programaci\'on Java, que facilita a los usuarios inexpertos, la implementaci\'on de aplicaciones gr\'aficas. Por ello se puede afirmar que se trata de un lenguaje muy orientado al dise\~{n}o

Otra de las ventajas que {\em Processing} nos proporciona, es que sin hacer ning\'un cambio, podemos compilar cualquier programa para hacerlo funcionar a trav\'es de Internet, ya que el IDE de programaci\'on incluido con la descarga ya nos ofrece dicha funcionalidad. A dem\'as de ser una implementaci\'on simplificada de Java, tambi\'en tenemos que tener en cuenta que no se nos priva de la posibilidad de utilizar cualquier funci\'on ni librer\'ia nativa de Java. 
Como podemos ver en la web de {\em Processing}\cite{processing}, el lenguaje est\'a muy bien documentado incluyendo manuales para cada una de las funcionalidades de las que dispone dicho lenguaje. La estructura de un programa escrito en {\em Processing} no es muy distinta de la de una aplicaci\'on en Java, de hecho, puede tener exactamente la misma estructura. Pero el lenguaje nos permite por ejemplo, definir un programa que no disponga de una funci\'on principal ni de clase como en el caso de Java.
A continuaci\'on se muestra un ejemplo de un programa en {\em Processing} que no dispone de clase ni funci\'on principal:

\begin{figure}[here]
    \centering
    \includegraphics[scale=0.3]{figuras/basics.jpg}
 \caption{Ejemplo de Processing 1}
\end{figure}
{\scriptsize
\begin{verbatim}
void setup() {
  size(480, 120);
  smooth();
}

void draw() {
  if (mousePressed) {
    fill(0);
  } else {
    fill(255);
  }
  ellipse(mouseX, mouseY, 80, 80);
}
\end{verbatim}}

El programa implementado anteriormente, como podemos observar, define dos funciones llamadas {\em draw} y {\em setup}. Estas est\'an siendo sobrescritas ya que por defecto, una aplicaci\'on escrita en {\em Processing} extiende de la clase {\em PApplet}, la cual contiene los m\'etodos {\em setup} y {\em draw}. La funci\'on {\em setup} podr\'iamos entenderla como lo que se conoce como un constructor en Java, ya que su funci\'on es la de inicializar los par\'ametros b\'asicos de la aplicaci\'on. Por otro lado, la funci\'on {\em draw}, es la que se ejecutar\'a en cada iteraci\'on del bucle principal de la aplicaci\'on. 

Como se ha mencionado anteriormente, {\em Processing} es un lenguaje extremadamente orientado a la programaci\'on gr\'afica para usuarios inexpertos, es por eso que encontramos variables como {\em mousePressed} que nos indican directamente si cualquier bot\'on del rat\'on ha sido presionado o no, adem\'as, tambi\'en se incluyen un conjunto de funciones que dibujan por pantalla primitivas tanto 2D como 3D.

Una vez vistos los conceptos b\'asicos del lenguaje {\em Processing} podemos decir que el programa anterior crea una ventana de medidas 480x120 y dibuja un circulo de radio 80 en la posici\'on del rat\'on y lo pinta de blanco en caso de que el rat\'on tenga alg\'un bot\'on presionado.
Otra de las funcionalidades que posee {\em Processing} y que nos ser\'a de mucha utilidad, son las funciones de dibujo en tres dimensiones
A continuaci\'on se muestra una aplicaci\'on de ejemplo que utiliza las funciones de dibujo en 3D que nos proporciona {\em Processing}:

\begin{figure}[here]
    \centering
    \includegraphics[scale=0.3]{figuras/tresde.jpg}
 \caption{Ejemplo de programa con Processing 2}
\end{figure}

\pagebreak

{\scriptsize\begin{verbatim}

size(640, 360, P3D); 
background(0);
lights();

noStroke();

pushMatrix();

translate(130, height/2, 0);
rotateY(1.25);
rotateX(-0.4);
box(100);

popMatrix();

noFill();
stroke(255);

pushMatrix();

translate(500, height*0.35, -200);
sphere(280);

popMatrix();

\end{verbatim}}

{\em Processing} dispone de dos modalidades de dibujo en tres dimensiones: P3D y OpenGL. La modalidad llamada OpenGL sirve para, al renderizar la imagen, utilizar el procesador de OpenGL en vez del que lleva implementado {\em Processing}. Sin embargo, si utilizamos la modalidad P3D, se utiliza un procesador de im\'agenes en tres dimensiones que lleva incorporado {\em Processing}. Este est'\a optimizado para procesar las diversas funcionalidades de tres dimensiones espec\'ificas de dicho lenguaje. Para seleccionar una de estas dos modalidades, debemos indicar en el programa cual de ellas hemos escogido en la instrucci\'on en la que indicamos las medidas de la pantalla.

Al igual que en OpenGL, podemos utilizar las funciones {\em pushMarix} y {\em popMatrix} para crear un \'arbol ger\'arquico de figuras tridimensionales de tal forma que, si desplazamos un elemento, todos sus elementos hijos ser\'an trasladados tambi\'en. A su vez, existe una versi\'on simplificada de las funciones {\em rotatef} y {\em tranlatef} que est\'an implementadas por defecto en OpenGL. Dichas funciones son  {\em rotate} y {\em translate} que llevan como argumentos la cantidad de movimiento o rotaci\'on a aplicar a la figura definida posteriormente. Por \'ultimo existen funciones que implementan las diferentes primitivas en tres dimensiones como puede ser {\em sphere} que lleva como argumentos el radio de la esfera.

Por todas las razones mencionadas para la implementaci\'on del proyecto se ha utilizado el lenguaje de programaci\'on {\em Processing}.

\pagebreak

Una vez decidido el lenguaje en el cual se realizar\'a la implementaci\'on de {\em Label Pro}, se tuvo que determinar a que tipo de p\'ublico ir\'a dirigido dicho programa. Dado que uno de los principales objetivos es que la implementaci\'on sea totalmente personalizable, el p\'ublico al que ir\'a dirigida la aplicaci\'on podr\'ia ser cualquiera dado que tambi\'en sus finalidades son muy variadas. Por lo tanto, para que el sistema sea amigable para todo tipo de usuario, se deber\'a investigar sobre la interacci\'on de los humanos con los sistemas inform\'aticos.

Por \'ultimo, se ha implementado un prototipo de aplicaci\'on la cual se puede adaptar para ser utilizada con {\em Label Pro} con la finalidad de etiquetar cuerpos humanos con simulaci\'on f\'isica incorporada, elevando as\'i las funcionalidades de la aplicaci\'on.